﻿using System;
using System.Collections.Generic;
using System.Linq;
using Scommesse.Model.TipiRisultato;

namespace Scommesse.Model
{
    public static class QuoteRetriever
    {
        private static IEvento _evento;
        private static readonly Random Random = new Random();

        private static void SetQuote(Dictionary<Tipologia, List<Quota>> dictionary, Tipologia tipologia, params float[] moltiplicatori)
        {
            var quote = new List<Quota>(moltiplicatori.Length);
            if (moltiplicatori == null) 
                throw new ArgumentNullException("moltiplicatori");
            int i = 0;

            Array valori = Enum.GetValues(_evento.Competizione.Categoria.Tipologie[tipologia]);
            // Il numero di moltiplicatori passati alla funzione (moltiplicatori.Length) 
            // deve essere uguale al numero di valori della tipologia (valori.Length), 
            if (moltiplicatori.Length != valori.Length)
                throw new ArgumentException("la tipologia selezionata deve avere " + valori.Length + " valori");

            // Si creano le quote della tipologia e alla fine dello switch si aggiungono al dictionary
            switch (tipologia)
            {
                case Tipologia.UXD:
                    foreach (Tipo1X2 r in from Valori1X2 v in valori select new Tipo1X2(v))
                    {
                        quote.Add(new Quota(_evento.Id, r, moltiplicatori[i]));
                        i++;
                    }
                    break;

                case Tipologia.UD:
                    foreach (Tipo12 r in from Valori12 v in valori select new Tipo12(v))
                    {
                        quote.Add(new Quota(_evento.Id, r, moltiplicatori[i]));
                        i++;
                    }
                    break;

                case Tipologia.UO:
                    foreach (TipoUO r in from ValoriUO v in valori select new TipoUO(v))
                    {
                        quote.Add(new Quota(_evento.Id, r, moltiplicatori[i]));
                        i++;
                    }
                    break;

                case Tipologia.GNG:
                    foreach (TipoGNG r in from ValoriGNG v in valori select new TipoGNG(v))
                    {
                        quote.Add(new Quota(_evento.Id, r, moltiplicatori[i]));
                        i++;
                    }
                    break;
            }

            dictionary.Add(tipologia, quote);
        }

        // Imposta quote random per gli eventi
        public static Dictionary<Tipologia, List<Quota>> GetQuote(IEvento ev)
        {
            _evento = ev;
            var dictionary = new Dictionary<Tipologia, List<Quota>>();
            foreach (KeyValuePair<Tipologia, Type> tipologia in _evento.Competizione.Categoria.Tipologie)
            {
                if (Enum.GetValues(tipologia.Value).Length == 3)
                    SetQuote(dictionary, tipologia.Key, RandomTripleValue(), RandomTripleValue(), RandomTripleValue());
                if (Enum.GetValues(tipologia.Value).Length == 2)
                    SetQuote(dictionary, tipologia.Key, RandomDoubleValue(), RandomDoubleValue());
            }
            return dictionary;
        }

        // Ritorna un moltiplicatore casuale per una tipologia con 3 valori
        private static float RandomTripleValue()
        {
            return (float) ((Math.Round((Random.NextDouble() + Random.Next(1, 3) * 1.5), 2)));
        }

        // Ritorna un moltiplicatore casuale per una tipologia con 2 valori
        private static float RandomDoubleValue()
        {
            return (float)((Math.Round((Random.NextDouble() + Random.Next(1, 2) * 1.5), 2)));
        }
    }
}